
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>如何配置ES集群实现高可用性？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>如何配置ES集群实现高可用性？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在Elasticsearch集群中，主节点(Master Node)和数据节点(Data Node)的核心职责有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主节点负责管理集群的元数据和状态，包括节点的加入或离开、索引的创建和删除、以及分片的分配。而数据节点则负责存储数据，并执行CRUD（创建、读取、更新、删除）操作、聚合等与数据直接相关的任务。</div>
          </div>
          <div class="card-source">来源: ES集群架构概述 -> 2. 节点类型与角色</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Elasticsearch中的副本分片(Replica Shard)主要起到哪两个关键作用以保障集群的高可用性和性能？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">副本分片主要有两个作用：1. 提高数据的高可用性和故障恢复能力，当主分片所在节点故障时，副本分片可以被提升为新的主分片，避免数据丢失。2. 提高查询性能，副本分片可以处理读取请求，实现负载均衡。</div>
          </div>
          <div class="card-source">来源: ES集群架构概述 -> 3. 分片（Shard）和副本（Replica）机制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">为了避免主节点成为单点故障(SPOF)，Elasticsearch推荐采用什么配置策略？为什么建议至少配置3个主节点候选者？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">为避免单点故障，推荐配置多个主节点候选者。建议至少配置3个，是因为ES采用多数派（quorum）机制进行主节点选举。拥有3个候选节点可以确保在其中一个节点故障后，剩余的两个节点仍能形成多数派，从而选举出新的主节点，保证集群正常运作。</div>
          </div>
          <div class="card-source">来源: 配置多主节点以避免单点故障 -> 1. 确定主节点候选者数量</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在跨数据中心部署中，如何利用“分片分配感知(Shard Allocation Awareness)”功能来提升集群的容灾能力？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">通过为不同数据中心的节点设置特定属性（如 `node.attr.zone: dc1`），并启用分片分配感知（`cluster.routing.allocation.awareness.attributes: zone`），可以确保Elasticsearch将主分片和其副本分片分布在不同的数据中心。这样，即使一个数据中心完全失效，另一个数据中心的副本也能保证数据的可用性。</div>
          </div>
          <div class="card-source">来源: 跨数据中心部署 -> 3.1 使用分片分配感知（Shard Allocation Awareness）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当Elasticsearch集群中的一个节点发生故障时，系统是如何自动检测并进行恢复的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Elasticsearch通过定期的心跳机制来监控节点健康。如果主节点在预设时间内未收到某个节点的响应，会将其标记为失效节点。随后，主节点会立即将该失效节点上的分片重新分配到集群中其他健康的节点上，以快速恢复数据的冗余和集群的可用性。</div>
          </div>
          <div class="card-source">来源: ES的容错和恢复机制 -> 2. 自动故障检测与恢复</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">除了分片复制机制，Elasticsearch还提供了什么功能用于灾难恢复，并且这些备份可以存储在何处？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Elasticsearch提供了快照与恢复（Snapshot and Restore）功能。快照是集群索引和元数据的定期备份，可以用于在灾难发生时恢复数据。这些快照可以存储在远程存储中，例如本地文件系统、AWS S3、或Google Cloud Storage。</div>
          </div>
          <div class="card-source">来源: ES的容错和恢复机制 -> 5. 快照与恢复</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在配置数据节点的JVM堆大小时，文档中提到的关键建议是什么？为什么会有不超过32GB的限制？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">建议将系统总内存的一半分配给JVM堆，但不要超过32GB。这是因为超过32GB后，JVM会失去指针压缩（compressed oops）的能力，这会降低内存的利用效率。</div>
          </div>
          <div class="card-source">来源: 数据节点和分片配置 -> 1.2 数据节点的配置</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在引导一个新的Elasticsearch集群时，哪两个配置项对于节点的相互发现和首次主节点选举至关重要？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">两个关键的配置项是 `discovery.seed_hosts` 和 `cluster.initial_master_nodes`。`discovery.seed_hosts` 用于列出所有主节点候选者的地址以供发现，而 `cluster.initial_master_nodes` 则指定了在集群首次启动时参与第一次主节点选举的候选者。</div>
          </div>
          <div class="card-source">来源: 配置多主节点以避免单点故障 -> 3. 配置主节点的发现和集群名称</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">什么是分布式系统中的“脑裂”问题？Elasticsearch如何利用仲裁机制来防止它？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“脑裂”是指在一个分布式集群中，由于网络分区导致集群被分割成多个无法通信的小集群，每个小集群都可能选举出自己的主节点，从而导致数据不一致。Elasticsearch通过配置 `discovery.zen.minimum_master_nodes`（仲裁节点设置）来防止脑裂，该设置要求只有在获得大多数（即仲裁数量）主节点候选者同意的情况下才能选举新主节点，从而避免了少数派分区形成独立的集群。</div>
          </div>
          <div class="card-source">来源: ES的容错和恢复机制 -> 7. 防止脑裂（Split Brain）</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
